package com.example.banksystem.controller;

import com.example.banksystem.service.DepositService; // 假设DepositService在service包下
import com.example.banksystem.type.DepositType;
import com.example.banksystem.entity.Deposit; // 交易实体类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 存款控制器：提供前端调用的API接口
 */
@RestController
@RequestMapping("/api/deposit") // 接口统一前缀
public class DepositController<Deposit> {

    @Autowired
    private DepositService depositService;

    /**
     * 前端提交存款表单时调用（创建存款记录）
     * 前端通过POST请求提交JSON数据
     */
    @PostMapping("/create")
    public com.example.banksystem.Result<Deposit> createDeposit(@RequestBody Deposit deposit) {
        try {
            Deposit savedDeposit = depositService.processDeposit(deposit);
            return com.example.banksystem.Result.success(savedDeposit, "存款成功");
        } catch (Exception e) {
            return com.example.banksystem.Result.error("存款失败：" + e.getMessage());
        }
    }

    /**
     * 前端加载存款类型下拉框时调用
     * 前端通过GET请求获取所有存款类型
     */
    @GetMapping("/transactions")
    public Result<List<Transaction>> getTransactions(
            @RequestParam(required = false) String date, // 可选参数：日期
            @RequestParam(required = false) String type) { // 可选参数：类型
        try {
            List<Transaction> transactions = depositService.getTransactions(date, type);
            return Result.success(transactions, "查询流水成功");
        } catch (Exception e) {
            return Result.error("查询流水失败：" + e.getMessage());
        }
    }
    @GetMapping("/types")
    public com.example.banksystem.Result<DepositType[]> getDepositTypes() {
        return com.example.banksystem.Result.success(depositService.getAllDepositTypes(), "获取存款类型成功");
    }
}

// 通用响应结果类（前后端数据交互格式）
class Result<T> {
    private int code; // 状态码：200成功，500失败
    private String msg; // 提示信息
    private T data; // 响应数据

    // 成功响应
    public static <T> com.example.banksystem.Result<T> success(T data, String msg) {
        com.example.banksystem.Result<T> result = new com.example.banksystem.Result<>();
        result.code = 200;
        result.msg = msg;
        result.data = data;
        return result;
    }

    // 失败响应
    public static <T> com.example.banksystem.Result<T> error(String msg) {
        com.example.banksystem.Result<T> result = new com.example.banksystem.Result<>();
        result.code = 500;
        result.msg = msg;
        return result;
    }

    // getter 方法
    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

    // setter 方法
    public void setCode(int code) {
        this.code = code;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void setData(T data) {
        this.data = data;
    }
}

